package model

import (
	"fmt"
	"os"
	"strings"

	"gitee.com/liumou_site/logger"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
	dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
)

// Update 更新记录信息
// Update 函数用于更新指定记录的IP地址。
// 该函数首先检查当前IP地址是否与记录中的IP地址一致，如果一致则无需更新。
// 如果不一致，则通过腾讯云API更新指定记录的IP地址。
//
// 参数:
//   - RecordId: 需要更新的记录的ID。
func (l *Login) Update(RecordId int, ip, sub string) {
	// 判断IP是否一致
	logger.Info("正在更新记录")
	fmt.Printf("%s.%s -> %s\n", sub, l.Domain.Domain.Domain, ip)
	if l.GetAnalyticalValue() == nil {
		if strings.EqualFold(l.Value, ip) {
			logger.Debug(l.Value, " -> ", ip)
			logger.Info("IP地址未发生变化,无需更新")
			return
		}
	}

	// 实例化一个认证对象，使用腾讯云账户的SecretId和SecretKey进行认证
	credential := common.NewCredential(
		l.Domain.Login.Id,
		l.Domain.Login.Key,
	)
	// 实例化一个client选项，设置API的端点
	cpf := profile.NewClientProfile()
	cpf.HttpProfile.Endpoint = "dnspod.tencentcloudapi.com"
	// 实例化要请求产品的client对象
	client, _ := dnspod.NewClient(credential, "", cpf)

	// 实例化一个请求对象，用于更新记录
	request := dnspod.NewModifyRecordRequest()

	// 设置请求参数
	request.Domain = common.StringPtr(l.Domain.Domain.Domain)
	request.RecordType = common.StringPtr(l.IPS.IpType)
	request.RecordLine = common.StringPtr("默认")
	request.Value = common.StringPtr(ip)
	request.RecordId = common.Uint64Ptr(uint64(RecordId))
	request.SubDomain = common.StringPtr(sub)
	request.Status = common.StringPtr("ENABLE")
	request.Remark = common.StringPtr(l.Domain.Domain.Remark)

	// 发送请求并获取响应
	response, err := client.ModifyRecord(request)
	if _, ok := err.(*errors.TencentCloudSDKError); ok {
		logger.Error("无法绑定响应数据: ", err)
		logger.Debug(response.ToJsonString())
		logger.Debug("域名: ", l.Domain)
		logger.Debug("子域名: ", sub)
		logger.Debug("解析ID: ", RecordId)
		logger.Debug("解析类型: ", l.IPS.IpType)
		logger.Debug("IP地址: ", ip)
		fmt.Println("")
		return
	}
	if err != nil {
		logger.Error("更新失败")
		fmt.Println(err.Error())
		fmt.Println(response.ToJsonString())
		fmt.Println(l.Url)
		os.Exit(4)
	}
	logger.Info("更新成功,原记录值: [ ", l.Value, " ]", " --- 新记录值: [ ", ip, " ]")
	fmt.Println(sub, " -> ", ip)
}
